/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pua.uniandes.recepcion;


import java.io.*;
import java.lang.ClassNotFoundException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bouncycastle.util.encoders.Base64;
import sun.applet.Main;

/**
 *
 * @author jd.velasquez3209
 */
public class Recepcion {

    /**
	 * Atributo que representa la conexion con el cohete a través de un socket UDP
	 */
	private DatagramSocket conexionCohete;
	
	/**
	 * Atributo que representa la conexión con el Centro de Monitoreo a través de un socket TCP
	 */
	private Socket conexionCentro;
	
	/**
	 * Atributo que escribe por el socket hacia el Centro de Monitoreo
	 */
	private PrintWriter pw;

	/**
	 * Método constructor de la clase principal Recepción
	 */
	public Recepcion()
	{
		recibirConexiones();
                HiloTransmisionVideo h = new HiloTransmisionVideo();
                h.start();
	}

        
	/**
	 * Método encargado de recibir las conexiones y establecerlas con el socket UDP.
	 */
	public void recibirConexiones()
	{
		try{
			conexionCohete=new DatagramSocket(5555,InetAddress.getLocalHost());
			conexionCentro=new Socket("127.0.0.1", 7854);
			DatagramPacket paquete=new DatagramPacket(new byte[1000], 1000);
			pw=new PrintWriter(conexionCentro.getOutputStream(),true);
			
			while(true)
			{
			
                            System.out.println("conexion" + conexionCohete.isConnected());
                            System.out.println("closed" + conexionCohete.isClosed());
                            conexionCohete.receive(paquete);
				String conv=conversion(paquete.getData(),paquete.getLength());
				pw.println(conv);
			}

		}
		catch(IOException e)
		{
			e.printStackTrace();
		}
	}

	/**
	 * Método que se encarga de la decodificación de base 64 y convertir el conjunto de bytes a String.
	 * @param Arreglo de bytes codificados en base 64
	 * @param Longitud de la cadena.
	 * @return La cadena en String ya decodificada.
	 */
	public String conversion(byte[] bytes, int num)
	{
		byte[] arreglo=new byte[num-2];
		for (int i=0;i<num-2;i++)
		{
			arreglo[i]=bytes[i+1];
		}
		byte[]arregloDeco= Base64.decode(arreglo);
		String result=new String(arregloDeco);

		return result;
	}

	/**
	 * Método MAIN
	 * @param args
	 */
	public static void main (String[] args)
	{
		new Recepcion();
	}
        
}

class HiloTransmisionVideo extends Thread {

    private static final int CANTIDAD_PAQUETE = 20;
    private static Socket socket;

    @Override
    public void run() {

        try {

            for (int i = 0; i < CANTIDAD_PAQUETE; i++) {
                System.out.println("Envia 1 archivo");
                socket = new Socket("localhost", 4646);
                OutputStream os = socket.getOutputStream();

                String direccionArchivoVideo = "./resources/video" + i + ".txt";
                File f = new File(direccionArchivoVideo);

                sendFile(f, os);

            }
            
            


        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }



    }

    private void sendFile(File file, OutputStream os) throws IOException, ClassNotFoundException {
        byte[] buf = new byte[1024];

        BufferedOutputStream out = new BufferedOutputStream(os, 1024);
        FileInputStream in = new FileInputStream(file);
        int i = 0;
        int bytecount = 1024;
        while ((i = in.read(buf, 0, 1024)) != -1) {
            bytecount = bytecount + 1024;
            out.write(buf, 0, i);
            out.flush();
        }

        socket.shutdownOutput(); /* important */
        System.out.println("Bytes Sent :" + bytecount);

        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
        ois.skip(Long.MAX_VALUE);
        String confirmation = (String) ois.readObject();
        System.out.println("from server : " + confirmation);
        in.close();
    }
}
